
import Vue from "vue"
import VueRouter from "vue-router"
import routes from './routes'


Vue.use(VueRouter)

//引入store
import store from '@/store'
import {removeToken} from '@/utils/token'

//一劳永逸解决一个问题：即：编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误问题
//1 先把VueRouter原型对象的push和replace方法保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

//2 重写push|replace方法
//第一个参数location：告诉原来的push方法，你往哪里跳转（传递哪些参数）
//第二个参数resolve：成功的回调
//第三个参数reject：失败的回调
VueRouter.prototype.push = function(location, resolve, reject){
    if(resolve && reject){
        //call和apply的区别：
        //相同点是都可以调用函数一次，都可以篡改函数的上下文一次
        //不同点是：call传递多个参数用逗号隔开，apply方法传递数组
        originPush.call(this, location, resolve, reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}

VueRouter.prototype.replace = function(location, resolve, reject){
    if(resolve && reject){
        //call和apply的区别：
        //相同点是都可以调用函数一次，都可以篡改函数的上下文一次
        //不同点是：call传递多个参数用逗号隔开，apply方法传递数组
        originReplace.call(this, location, resolve, reject)
    }else{
        originReplace.call(this,location,()=>{},()=>{})
    }
}


//配置路由
const router = new VueRouter({
    routes,
    //滚动行为
    scrollBehavior(to, from, savedPosition){
        return {y: 0}
    }
})


//全局守卫：前置守卫（在路由跳转之前进行判断）
router.beforeEach(async (to, from, next)=>{
    let token = store.state.user.token
    let name = store.state.user.userInfo.name


    /**
     * 以下是所有页面都必须登录才能访问（除了注册页）
     * 
     */
    // if(to.path=='/login'){ //如果去login
    //     //判断用户是否登录了
    //     if(token){ //如果用户已经登录了
    //         next('/home') //直接跳转到home
    //     }else{ //如果用户没有登录
    //         next() //放行
    //     }
    // }else if(to.path=='/register'){ //如果去注册页面
    //     //判断用户是否登录了
    //     if(token){ //如果用户已经登录了
    //         next('/home') //直接跳转到home
    //     }else{ //如果用户没有登录
    //         next() //放行
    //     }
    // }else{//如果不是去login也不是去注册页
    //     if(token){ //如果用户已经登录了
    //         if(name){  //如果仓库中用户名已有
    //             next()
    //         }else{
    //             //没有用户信息，则派发action让仓库存储用户信息再跳转
    //             try {
    //                 //获取用户信息成功
    //                 await store.dispatch('getUserInfo')
    //                 next()
    //             } catch (error) {
    //                 //获取用户信息失败（token失效的情况）
    //                 //把仓库中相关存储清空，本地存储清空
    //                 store.state.user.token = ''
    //                 store.state.user.userInfo = {}
    //                 removeToken()
    //                 // 重新登录
    //                 next('/login')
    //             }
    //         }
    //     }else{ //如果用户没有登录
    //         next('/login')  //跳转到login
    //     }
    // }
    /**
     * 以上是所有页面都必须登录才能访问
     * 
     */
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 以下是限制了登录了之后不能去登陆页面；如果未登录，则不能去交易相关得页面，会跳转到login，其他页面放行。
     * 
     */

    if(token){  //如果用户登录了
        if(to.path=='/login' || to.path=='/register'){ //用户已经登录了，还想去login或register，则不可以，直接跳转到home
            next('/home')
        }else{
            if(name){  //如果仓库中用户名已有
                next()
            }else{
                //没有用户信息，则派发action让仓库存储用户信息再跳转
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    //获取用户信息失败（token失效的情况）
                    //把仓库中相关存储清空，本地存储清空
                    store.state.user.token = ''
                    store.state.user.userInfo = {}
                    removeToken()
                    // 重新登录
                    next('/login?redirect='+to.path)
                }
            }
            
        }
    }else{  //如果用户没有登录
        //如果未登录，则不能去交易相关得页面[/pay,/paysuccess,/center,/center/myorder,/center/grouporder,/trade,/shopcart,/addcartsuccess]
        let toPath = to.fullPath

        if(toPath.indexOf('/pay')!=-1 || toPath.indexOf('/center')!=-1 || toPath.indexOf('/trade')!=-1 || toPath.indexOf('/shopcart')!=-1 || toPath.indexOf('/addcartsuccess')!=-1){
            next('/login?redirect='+toPath)
        }else{
            next()
        }
        
    }

})


export default router